#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <functional>

//using func_t = std::function<void*(void*)>;

typedef void* (*func_t)(void*) ;

class Task
{
    public: 
        Task(func_t f)
            :_f(f)
        {
            ;
        }
        ~Task()
        {}

        func_t Ptr()
        {
            return _f;
        }
    private:
        func_t _f;
};

class Thread
{
    public:
    
    // 初始化函数和传参。
    Thread(Task t,void* argv)
        :_t(t)
        ,_Ptr(argv)
    {
        ;
    }

    ~Thread()
    {
        // 当该线程没被取消时，

        std::cout << "析构Thread" << std::endl;

        if(isrunning == true)
        {
            void* ret = nullptr;

            pthread_join(_pt,&ret);
        }
    }

    // 开始执行对应的线程。
    void Start()
    {
        int ret = pthread_create(&_pt,nullptr,_t.Ptr(),_Ptr);
        if(ret == 0)
        {
            std::cout << "成功创建线程" << std::endl;
        }
        else
        {
            std::cerr << "成功创建线程" << std::endl;;
            return ;
        }
        isrunning = true;
    }

    // 取消对应的线程。
    void Cancel()
    {
        int n = pthread_cancel(_pt);

        if(n == 0)
        {
            isrunning = true;
        }

        std::cout << "取消线程" << std::endl;
    }

    private:
        pthread_t _pt;
        Task _t;
        void* _Ptr;
        bool isrunning;
};